/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package livraria.objects;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import livraria.database.Conexao;
import livraria.database.DBUtils;
import livraria.database.exceptions.ErroDatabaseException;
import livraria.database.exceptions.ValorJaExisteException;

/**
 *
 * @author Ivanovikjch
 */
public class Cliente {
    //Dados do cliente
    private int cpf_cnpj;
    private String nome;
    
    //Classe que contem os dados das vendas do
    private ArrayList<Venda> vendas =  new ArrayList<Venda>();
    
    //Dado de controle de database, se for true , o objeto ja esta salvo na database
    private boolean ValorRegistrado;
    
    public Cliente(int cpf_cnpj, String nome) throws SQLException{
        this(cpf_cnpj, nome, false);
    }
    public Cliente(int cpf_cnpj, String nome, boolean reg) throws SQLException{
        this.cpf_cnpj = cpf_cnpj;
        this.nome = nome;
        this.ValorRegistrado = reg;
        obtemVendasDB();
    }
    
    private void obtemVendasDB() throws SQLException{
        Statement stm = Conexao.conecta().createStatement();
        ResultSet rs = stm.executeQuery("SELECT id, livro, nitens FROM vendas WHERE cliente = "+cpf_cnpj);
        while(rs.next()){
            vendas.add(new Venda(rs.getInt("id"),rs.getInt("nitens"), DBUtils.getLivroByCodigo(rs.getInt("livro"))));
        }
    }
    //Metodos para obtencao e alteracao de valores
    
    public int getCpf_cnpj(){return cpf_cnpj;}
    public String getNome(){return nome;}
    public ArrayList<Integer> getIdsVendas (){
        ArrayList<Integer> ids=new ArrayList<Integer>();
        for (Venda venda : vendas)
            ids.add(venda.id);
        return ids;
    }
    public int getNintens (int id) throws Exception{
        for (Venda venda : vendas)
            if(venda.id==id)
                return venda.nitens;
        throw new Exception("Venda nao encontrada");
    }
    
    public void addNovaVenda(int id, int nitens, Livro livro) throws SQLException{
        try {
            PreparedStatement stm = Conexao.conecta().prepareStatement("INSERT INTO vendas VALUES(?, ?, ?, ?)");
            stm.setInt(1, id);
            stm.setInt(2, cpf_cnpj);
            stm.setInt(3, livro.getCodigo());
            stm.setInt(4, nitens);
            int alteracoes = stm.executeUpdate();
            if(alteracoes == 0) 
                throw new ErroDatabaseException();
            stm.close();
            vendas.add(new Venda(id,nitens,livro));
        } catch (SQLException ex) {
            throw new ValorJaExisteException();
        }
    }
    
    //metodos para o registro do objeto na database
    private void insert() throws ErroDatabaseException{
        try {
            PreparedStatement stm = Conexao.conecta().prepareStatement("INSERT INTO clientes VALUES(?, ?)");
            stm.setInt(1, cpf_cnpj);
            stm.setString(2, nome);
            int alteracoes = stm.executeUpdate();
            if(alteracoes == 0) 
                throw new ErroDatabaseException();
            stm.close();
            for(Venda venda : vendas){
                stm = Conexao.conecta().prepareStatement("INSERT INTO vendas VALUES(?, ?, ?, ?)");
                stm.setInt(1, venda.id);
                stm.setInt(2, cpf_cnpj);
                stm.setInt(3, venda.livro.getCodigo());
                stm.setInt(4, venda.nitens);
                alteracoes = stm.executeUpdate();
                if(alteracoes == 0) 
                    throw new ErroDatabaseException();
                stm.close();
            }
            
        } catch (SQLException ex) {
            throw new ErroDatabaseException();
        }
    }
    private void update() throws ErroDatabaseException{
        try {
            PreparedStatement stm = Conexao.conecta().prepareStatement("UPDATE clientes SET nome = ? WHERE cpf_cnpj = ?");
            stm.setInt(2, cpf_cnpj);
            stm.setString(1, nome);
            int alteracoes = stm.executeUpdate();
            if(alteracoes == 0) 
                throw new ErroDatabaseException();
            stm.close();
            for(Venda venda : vendas){
                stm = Conexao.conecta().prepareStatement("UPDATE vendas SET id = ?, livro = ?, nitens = nitens = ? WHERE cliente = ?");
                stm.setInt(1, venda.id);
                stm.setInt(4, cpf_cnpj);
                stm.setInt(2, venda.livro.getCodigo());
                stm.setInt(3, venda.nitens);
                alteracoes = stm.executeUpdate();
                if(alteracoes == 0) 
                    throw new ErroDatabaseException();
                stm.close();
            }
            
        } catch (SQLException ex) {
            throw new ErroDatabaseException();
        }
    }
    
    public void save() throws ErroDatabaseException{
        if(this.ValorRegistrado)
            update();
        else
            insert();
        
        this.ValorRegistrado = true;
    }
}

//Classe criada apenas para melhor organizacao de codigo
class Venda{
    public int id, nitens;
    public Livro livro;
    
    Venda(int id, int nitens, Livro livro){
        this.id = id;
        this.livro = livro;
        this.nitens = nitens;
    }
}